нестандартных единиц с нестандартными моделями
я через редактор кампаний нажимал на одну миссию правой кнопкой редактировать
потом я сохранял карту отдельно
когда варике открываю карту то все юниты теряют свои модели на стандартные
как мне сделать чтобы модели и все прочее сохранялось
нестандартных единиц с нестандартными моделями
я через редактор кампаний нажимал на одну миссию правой кнопкой редактировать
потом я сохранял карту отдельно
когда варике открываю карту то все юниты теряют свои модели на стандартные
как мне сделать чтобы модели и все прочее сохранялось
Воу... Джаз не обязательно изучать, всё это можно сделать и на ГУИ, тем более такую простую способность. На этом сайте есть тема "Заклинания на заказ". Заказывай, жди, получай, изучай. Если прям горит, могу сделать для тебя сам.
Есть одна наработка - Dota helper, это dll которая подключается мемхаком к карте, дает много чего (в основном для доты), но там есть дабл клик, который реализован так: когда игрок нажал способность и пытается её кликнуть в область инетфейса, код из библиотеки мгновенно переносят курсор в позицию портрета, так как определение координат виджетов на экране уже есть, думаю автонаведение сделать вполне можно.
Но это уже C++ и поддержки нету, думайте и решайте все сами.
ВНЕЗАПНО это делается одним действием: Игра - Enable/Disable Drag-Selection (настроенное на Disable drag-selection functionality (disable drag-selection box)).
Если хочешь узнать что такое альфаканал поможет репетитор (Гугл), прозрачность и альфа-канал одно и тоже(почти), не умеешь попроси чтобы помогли сделать.
Я тебя понял, я пытался, всё тщетно. Придется создавать способность пустышку, например, на основе смертельного удара, а затем триггерно при изучении смертельного удара добавлять твою, невидимую.
Туман рики есть обычный туман ястреба, настраиваешь там предотвращённые атаки и шанс промаха, но здесь есть кое-какой провал.
Дело в том, что туман устроен так багнуто, что может работать нормально только у красного игрока. Вообщем делать надо вот так:
Создаём дамми для каста тумана, для игрока 1 красный!
Если сам туман скастовал союзник первой команды, то даём туман, действующий на врагов(в допустимых целях враги)
Если сам туман скастовал враг первой команды(враг красного), то даём туман, действующий на союзников(в допустимых целях союзники)
Вот так
Берем основную модель, возможно, вообще без мяса, только с гусеницами, но с кучей точек крепления. Также берем кучу моделей-аттачметов, представляющих собой эти самые пушки, корпуса и все прочее. При выборе характеристик модели через диалог или интерфейс соответственно создаем на основной модели эффекты-аттачменты, будет собрана техника. Такие штуки, как двигатель и прочие невидные извне элементы будут скорее входить в математическую модель юнита, но это также можно запилить. Название танка - сразу не скажу, есть ли триггер на смену, но на таблице рекордов можно отобразить что угодно.
2.Тоже можно.
Создаем погодный в определенной местности и делаем два триггера для контроля входа-выхода юнитов из нее. На искомых юнитов применяем нужные способности - и все готово.
Здесь чуть сложнее: нужно постоянно проверять тип местности под юнитом, но тоже можно. Проверка на ограждения тоже может бить сделана.
4.Это уже интереснее. Видел раньше подобное в играх. При каждой атаке юнита случайным образом наносим или не наносим доп. урон, эффект горения, кидаем спелл на цель в зависимости от теоретического места попадания атаки.
5.И это можно. Но нужно писать нестандартную систему Альянса. Но через триггеры и JASS все можно...
Продажа техники - лучше через способность, что бы кидать ее на понравившегося юнита, не стоит покупать кота в мешке. Стоимость должна зависеть от технического уровня юнита, его текущего состояния (мертвый танк попадет вам бесплатно, сами чините!), если он был модернизован дополнительно, то это тоже входит в стоимость. Разрешение на продажу делаем аналогично.
Это легко через Custom Value и переменние.
Как ты понял, все что ты предложил создать можно, но на это нужно потрать хороший кусок времени. Остается пожелать тебе удачи над созданием проекта - мне идея уже нравится.
GetTriggerEvalCount - сколько раз условие сработает (если триггер выключен, то событие с условием все равно работают, и будет прибавлять без конца). Еще понял, что, если выключен (через галочку), то это не будет работать. Есть специальная команда TriggerEvaluate, можно проверить с помощью нее. Это короче сколько раз прокатывает условие (см. TriggerEvaluate) GetTriggerExecCount - сколько раз сработал триггер (если триггер выключен, то счетчик GetTriggerExecCount не засчитает это). Вроде это за поток отвечает, например Execute. Мне вот интересно, а вот в ForGroup проверить можно сколько потоков стало? вроде ничего не будет
TriggerEvaluate - проверка, проверяет есть ли у триггера условие. Проверяет скорее всего, то что прокатывает ли условие (пример функции ConditionalTriggerExecute). Можно на любом триггере проверить это. Если триггер выключен (не в самих триггерах, а в разделе редактора триггеров через галочку - если снять включен, то не работает проверка), то это не проверишь. Некоторые хитрецы используют функцию условия, это будет быстрее, а точнее раньше выполняется. С этим можно использовать TriggerEvaluate
TriggerExecute - запускает поток функции (действие триггера запускает), игнорируя условие и событие. Однако, не используйте варкрафтовские переменные вроде GetTriggerUnit(), так как они не будут работать, ибо они пусты и зависят от события. TriggerExecuteWait - то же самое, что и TriggerExecute. В чем разница между двумя мне неизвестно. Проверял маленько. ResetTrigger - перезапускает триггер и обнуляет значения GetTriggerEvalCount и GetTriggerExecCount TriggerSleepAction - он же вэйт, паузит на время поток (не паузит весь триггер), короче действие (action). В условии эта штука не работает, обрывает поток. В некоторых функциях он также не работает, например ForGroup, В ForGroup видимо отдельные потоки создает и шлет, на каждого свой поток, если вставит там вэйт, то он обрубает поток и все. А то что внизу осталось, он до конца не обработает уже никогда. Это пример.
раскрыть
Вот результаты:
Вызов TriggerSleepAction внутри TriggerEvaluate убивает поток, и он никогда не возобновляется.
Вызов TriggerSleepAction внутри TriggerExecute работает.
Вызов TriggerSleepAction внутри TriggerExecuteWait выполняет то же самое, что и TriggerExecute.
Иногда может обрывать поток в неожиданных местах. Например, ForGroup. А иногда работает.
IsTriggerWaitOnSleeps, - эта особая проверка триггера, проверяет включена ли пауза (короче вэйт TriggerSleepAction будет работать, иначе нет). С этой функцией связана другая функция TriggerWaitOnSleeps. IsTriggerWaitOnSleeps возвращает истину true - значит вэйт включен, false - вэйт выключен. Кстати я долго мучался, оказывается, что, если все в первый раз, то функция вернет false, даже, если вэйт работает. TriggerWaitOnSleeps - функция которая включает вэйт (true) и выключает вэйт (false). Короче пропускает время ожидания вэйта. У меня эта функция работает не сразу, или вообще не работала, тыкал пока не заработало.
Не удивительно, кто так делает?
Никаких вейтов в гуппах использовать нельзя, что за глупость! Для задержек существуют таймеры!
Слишком низкое время жизни дамми юнита, ставь секунд 5, то рисукуешь убить юнита неизвестно кем.
Ты не даешь видимость и не создаешь даммика за нейтрально пассивных, а зря! Даммик может не удивить в кого ему кинуть корни, цель можеть быть в тумане войны.
Чтобы кинуть корни в случайных юнитов в радиусе, есть особое дейстие GroupPickRandomUnit().
Спелл нужно переписать с 0, так же удалить русс. триггеры!
Все способности на основе одной базовой сделаны?
В таком случае у них общий приказ и, соответственно, игра пытается запустить их все одновременно.
Рекомендую делать на основе способности канал - ему можно выставить любой приказ на свой вкус и, соответственно, избавиться от одновременной активации всех способностей, если каждой способности дать разные приказы.
Никак.
Хотя если рыть очень глубоко с шрифтами, то возможно одна из категорий шрифта отвечает за эту циферку. Если повезёт - она при этом не будет отвечать ни за какие другие экранные шрифты в игре. Заменить шрифт в этой категории на малюсенький или бесцветный какой-нить - вот и удалили циферку. Как менять щрифт в карте отдельная статья.
создаём каждой абилке 11 копий и у каждой ставим иконку нужного цвета
потом разным игрокам абилки с разным цветом
для приказов:
заменяем обычные кнопки приказов на скилы
S2I принимает строку в качестве параметра и никак её не изменяет
с чего вдруг он должен создавать новые строки?
I2S создаёт временную строку
если в таблице есть строка равная временной по хэшу то он возвращает строку из таблицы
если в таблице строки нету то он добавляет нашу временную строку в таблицу
т.е. обычный алгоритм хэширования
Он лежит на случай если игре необходим данный реф. В РО ты мог иногда видеть необходимое приложение и варианты small, medium и large. Также по возможности спецэффекты и эффекты способностей могут к ней крепиться.
А collission насколько я помню отвечает за выделение или за столкновение летающих юнитов. На всякий случай оставляй, а то мало ли, да и места много не просит.
darkowlom, ну я сабжом расставил нужные текстуры. Из всего что пора пришло в голову только использовать триггер "Окружение" и в нужных местах областями ставить текстуры. Но это как муторно.. Вот и решил спросить можно ли обойти ограничения.
Это делается функциями GetTerrainType и SetTerrainType.
Рисуешь на тех же самых текстурах определенную допустим квадратную локацию.
Затем for стартовоеX до конечноеX внутри for СтартовоеY до КонечноеY если getterraintype = точтонадозаменить то setterraintype на другую текстуру.
Других адекватных методов нет. Триггер который ты привел использует локации (точки), а значит - это возня с точками - возможно утечки.
Я используя эти функ целиком всю карту стираю размера 256x256 и отрисовываю 10к тайлов, в одном проекте). Лаг если и есть во время перерисовки - то незаметный, не больше 0.5сек
Master113, добавить через "Новое условие" оператор "или" (Там два разных варианта, удобнее "or, multiple conditions" ("или, несколько условий" - как-то так)), туда поместить сравнения для каждого юнита. (Условие "или" будет выполняться, если выполнится хотя бы 1 условие внутри. Для оператора "и" - должны выполняться все условия внутри. Стандартный раздел триггера "Условия" действует как "и").
ТЬФУ! Никто, начиная с меня, JASS читать не умеет!
call SetAbilityCD (GetSpellAbilityId(), i, GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) * percent)
на русский переводится как:
Задать перезарядку способности (Кастуемая способность, уровень i, получить перезарядку способности юнита на ТЕКУЩЕМ УРОВНЕ СПОСОБНОСТИ ЮНИТА и умножить на нашу переменную)
Какого хрена тут ТЕКУЩИЙ УРОВЕНЬ, когда должен тоже быть уровень i?! Оно в цикле везде берет текущий уровень абилки вмеcто i. Т. е. если перезарядка на разных уровнях разная, это уже ппц ошибка.
Сейчас как раз фикшу эту абилу, она один хрен не до конца правильно действует, и уже тут самые разные извращения с ней получались, после выхода из вара фаталило, крч, 90% вероятности, что другие абилы Психопомпы в поряде, а фатал здесь.
Короче, вот, вроде теперь действует нормально.
Извините уж, что не под катом, мозги уже не имеют сил кат вставлять.
function BendingEffect takes nothing returns nothing
local real percent = 1.00
local real percent2 = 0.00
local integer i = 11
local integer percentchange = 0
if ( GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit()) >= 1 ) and (GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) >= 1) then
УВЕЛИЧЕНИЕ НА 1%
if UnitHasBuffBJ(GetTriggerUnit(),'B0H8') == true then
set percent = 1.01
endif НА 1% - ЗАКРЫТО.
УВЕЛИЧЕНИЕ НА 2%
if UnitHasBuffBJ(GetTriggerUnit(),'B0H9') == true then
set percent = 1.02
endif НА 2% - ЗАКРЫТО.
УВЕЛИЧЕНИЕ НА 3%
if UnitHasBuffBJ(GetTriggerUnit(),'B0HA') == true then
set percent = 1.03
endif НА 3% - ЗАКРЫТО.
УВЕЛИЧЕНИЕ НА 4%
if UnitHasBuffBJ(GetTriggerUnit(),'B0HB') == true then
set percent = 1.04
endif НА 4% - ЗАКРЫТО.
УВЕЛИЧЕНИЕ НА 5%
if UnitHasBuffBJ(GetTriggerUnit(),'B0HC') == true then
set percent = 1.05
endif НА 5% - ЗАКРЫТО.
ТАЛАНТ СИЛЬНОЕ ИСКРИВЛЕНИЕ
set i = 0
set percent = percent - 1
loop
set i = i + 1
exitwhen i > 12
if ( GetUnitAbilityLevelSwapped('A281', udg_Circle[i]) == 2 ) then
set percent = percent * 2
set i = 12
endif
endloop
set percent = percent + 1 ТАЛАНТ СИЛЬНОЕ ИСКРИВЛЕНИЕ - ЗАКРЫТО.
ОКРУГЛЕНИЕ ДО СОТЫХ (ИНАЧЕ МОГУТ ЗАПИСАТЬСЯ ДОП. ЦИФРЫ НЕ В ТЕ ЯЧЕЙКИ)
loop
exitwhen i < 1
set i=i - 1
set percent2 = GetAbilityCD(GetSpellAbilityId(), i) * percent
set percent2 = percent2 * 100
set percentchange = R2I(percent2)
set percent2 = I2R(percentchange)
set percent2 = percent2 * 0.01
call SetAbilityCD(GetSpellAbilityId() , i , percent2)
endloop
ОКРУГЛЕНИЕ ДО СОТЫХ - ЗАКРЫТО.
endloop
else
endif
else
endif
endfunction
//////////////
Ну, короче, действует-то однозначно она уже лучше, раньше цифры высчитывались с избытком, теперь явно правильнее. Насчет фаталов время покажет... Но все равно стало лучше.
Clamp, когда ты начнешь внимательно читать что я пишу!
Там грузится не то что он написал в описании задания а все строки из констант и все пути к текстурам.
Что именно грузит движок в момент открытия вкладки задания, можно прелоадом.
Вот содержимое pld файла у меня:
Просто это одна из способностей, у которой такая фигня получается. У тебя в поле заклинания должно быть два значения. Производная от печати преисподней и от Печати преисподней (слуга)
IcE_PLayER, Кароче у всех инвизов фейд тамй не стакается, если один начался, второй не начнется.
Добавляйте 'Amin' с временем перехода в инвиз когда вздумается, а не при создании мины.
Так же можно паузить юнита (точно помню что работало с инвизами волков) и юнит становится видим, минам же ненужно ходить или кастовать спеллы, на них не распространяются никакие баффы (как на все варды), так что пауза тоже зайдет без проблем...
]]Chupakabra[[, я понял. Крч на костылях придется лепить. Попробуй при выборе героя добавлять геройские абилки, а потом блочить или удалять их. Думаю, так можно добавить до 7 штук. Через ро не получается больше 5.
Если не получится - пробуй делать полностью триггерно с помощью спеллбука.
А касательно остальной части, если UnitUserData нигде не используется, создаешь массив юнитов и отрядов. Массив юнитов забиваешь своими капитанами. В UnitUserData капитана пихаешь его порядковый номер в массиве. Создаешь группу юнитов для этого капитана.
Добавление через каст способности.
Я бы делал через 2 разные абилки с одной и той же позицией в интерфейсе. Пока нужный тебе юнит не является частью отряда - у него таргетная абилка при касте которой на капитана он добавляется в группу соответствующего капитана и получает 2ю абилку взамен первой.
Касательно выделения этих пехотинцев - можно намутить что-то с передачей контроля или создать триггер, который будет снимать выделение с юнитов у которых есть 2я абилка. Если ты хочешь чтобы по одиночке можно было выделять пехотинцев - можешь создать переменную для каждого игрока с капитанами, куда будет просто записываться последний выбранный юнит. При снятии выделения - проверять не выбран ли этот же юнит, в случае чего не снимать выделение. Правда не уверен будет ли корректно работать :> В крайнем случае - будет работать в три клика вместо двух. Если я не ошибаюсь.
Касательно поведения этих пехотинцев - что-то реально стоящее сделать сложно. Возможно, но мне не с руки все расписывать :> Простейший вариант - приказывать пехотинцам после добавления в группу следовать за капитаном.
Добавление через атаку капитана
Триггер, проверяющий что капитан получил урон или атакован, как угодно. Далее любым способом проверяешь есть ли в группе этого капитана юниты. Если нет - выбираешь всех пехотинцев N радиусе, добавляешь в отряд, заменяешь абилку/либо просто приказываешь кастануть в капитана первую абилку.
Если как в Diablo, то я когда-то такую систему делал. Пишу по памяти. Нужно создать несколько переменных:
логические (их количество = количеству порталов) - определяют, можно ли перемещаться в данную точку
диалог - показывает доступные порталы
диалоговые кнопки (их количество тоже = количеству порталов) - при их нажатии идёт перемещение в нужный портал
точки (количество точек = количеству порталов) - куда именно перемещается герой. Лучше делать локальными, чтоб в памяти не висели.
На карте в местах порталов нужно создать небольшие области, при входе в которые будет показываться диалог.
Для активации порталов можно делать проверку при входе в область (логическая переменная). Если портал неактивен (переменная = нет), то установить переменную = да (то есть доступность портала).
Далее показывается диалог, где показываются кнопки активных порталов. При нажатии переносит в соответствующую точку. При переносе лучше отключить триггер, реагирующий на вход в область и включить после перехода.
Ещё варианты: вместо использования логических переменных проверять условие (например, жизнь конкретного юнита в области типа "портал" = Х; у конкретного юнита в области типа "портал" есть определённая способность-пустышка; если портал - декорация, то проверять её прочность); вместо диалога сделать выбор в панели способностей юнита-портала (типа как у магазина, причём переход можно сделать платным).
Вариантов можно много придумать, в общем.
А если нужен переход с карты на карту, то можно посмотреть в той же кампании, как это сделано.
Ещё есть интересная статья, информацию из которой у меня всё руки не доходят применить - xgm.guru/p/wc3/transitions-tutorial.
у каждого формата свой алгоритм,вот из за этого такая разница ,особенно на вес блп влияет прозрачность что лутше прозрачные места которые не затрагивает меш красить чёрным цветом
Zhenya17, ты хотя бы основные статьи прочти и учебник 1 класса по логике
какой по твоему должна быть применяемая способность если способность никто не применяет?
когда прочтёшь то пикай на карте нужных тебе героев и удаляй у них нужную тебе способность
Если во всех картах одинаковый id, значит покопайся в хеше.
Это как, можно в личку?
Проблему решил, переделав стандартную способность, а не создавая нестандартную. Это почти что панацея от подобных случаев, когда id (ещё называют raw-code) способности меняется.
Лимит операций, обычно это беда настигает заядлых гуишников.
На jass обычно нету таких проблем.
Создайте таймер с периодом .00 сек и запускайте им функции инициализации триггеров.
функция типа InitTrig_Имя триггера - это функция инициализации триггера, она вызывается из функции InitCustomTriggers, но если этих вызовов очень много то функция упирается в лимит операций и поток завершается так и не создав все триггеры.
отменять постройку юнита если технология уже ап
либо как сразу говорили через ап здания
где каждому твоему зданию будет соответствовать такое же здание но с дополнительным слотом
с продажей юнита открываешь доту и смотришь как там сделан спелл передать предметы у куры
он сделан как раз через продажу юнита
иначе никак
если не нравится пожалуйся богу об этом
или близардам
пусть выпустят новый патч специально для тебя
» WarCraft 3 / Карты из стандартных кампаний
» WarCraft 3 / Карты из стандартных кампаний
» WarCraft 3 / Что это?
» WarCraft 3 / Вопрос про Custom Script
» WarCraft 3 / Сложное время
» WarCraft 3 / Как сделать прозрачность?
» WarCraft 3 / Не знаю баг или нет
» WarCraft 3 / Броня в варике
» WarCraft 3 / Безмолвие, туман
» WarCraft 3 / Каков лимит утечек?
» WarCraft 3 / Странное условие
» WarCraft 3 / Spellbook
» WarCraft 3 / Кнопки мини-карты
» WarCraft 3 / Иконка в mpq
» WarCraft 3 / Изменение скорости анимации
» WarCraft 3 / Вопрос
» WarCraft 3 / текстуры ланда
» WarCraft 3 / Меню заданий
» WarCraft 3 / Эффект статуса.
» WarCraft 3 / Триггерные порталы
» WarCraft 3 / Помогите с созданием этого спелла
» WarCraft 3 / Порталы
» WarCraft 3 / Перевод карты
» WarCraft 3 / Как временно удалить способность у героя?
» WarCraft 3 / Бесконечные герои